// 集合类型演示文件: collections_demo.rs
// 本文件演示Rust中常用集合类型(Vec, HashMap, HashSet)的基本语法

// 导入标准库中的集合模块
use std::collections::{HashMap, HashSet};

pub fn main() {
    // 1. Vec (类似于List) - 动态数组，允许重复元素，保持插入顺序
    println!("===== Vec (列表) 演示 =====");
    let mut numbers: Vec<i32> = Vec::new(); // 创建空Vec
    numbers.push(10); // 添加元素
    numbers.push(20);
    numbers.push(30);
    println!("创建并添加元素后的Vec: {:?}", numbers);

    // 访问元素 (两种方式)
    println!("通过索引访问第一个元素: {}", numbers[0]);
    println!("通过get方法访问第二个元素: {:?}", numbers.get(1));

    // 遍历Vec
    println!("遍历Vec元素:");
    for num in &numbers {
        println!("{}", num);
    }

    // 修改元素
    numbers[1] = 200;
    println!("修改后的Vec: {:?}", numbers);

    // 获取Vec长度
    println!("Vec长度: {}", numbers.len());

    // 2. HashMap (键值对集合) - 存储键值对，不保证顺序
    println!("\n===== HashMap (映射) 演示 =====");
    let mut scores: HashMap<String, i32> = HashMap::new();
    scores.insert(String::from("Alice"), 95); // 插入键值对
    scores.insert(String::from("Bob"), 85);
    scores.insert(String::from("Charlie"), 90);
    println!("创建后的HashMap: {:?}", scores);

    // 访问值
    let alice_score = scores.get("Alice");
    println!("Alice的分数: {:?}", alice_score);

    // 遍历HashMap
    println!("遍历HashMap键值对:");
    for (key, value) in &scores {
        println!("{}: {}", key, value);
    }

    // 更新值
    scores.insert(String::from("Bob"), 92); // 覆盖已有键的值
    println!("更新Bob分数后的HashMap: {:?}", scores);

    // 只在键不存在时插入
    scores.entry(String::from("Dave")).or_insert(88);
    println!("插入新键Dave后的HashMap: {:?}", scores);

    // 3. HashSet (集合) - 存储唯一元素，不保证顺序
    println!("\n===== HashSet (集合) 演示 =====");
    let mut fruits: HashSet<String> = HashSet::new();
    fruits.insert(String::from("Apple"));
    fruits.insert(String::from("Banana"));
    fruits.insert(String::from("Orange"));
    fruits.insert(String::from("Apple")); // 重复元素不会被插入
    println!("创建后的HashSet: {:?}", fruits);

    // 检查元素是否存在
    println!("HashSet中是否包含Banana: {}", fruits.contains("Banana"));

    // 遍历HashSet
    println!("遍历HashSet元素:");
    for fruit in &fruits {
        println!("{}", fruit);
    }

    // 删除元素
    fruits.remove("Orange");
    println!("删除Orange后的HashSet: {:?}", fruits);

    // 集合操作
    let mut veggies: HashSet<String> = HashSet::new();
    veggies.insert(String::from("Carrot"));
    veggies.insert(String::from("Apple")); // Apple同时在fruits和veggies中

    // 交集
    let intersection: HashSet<_> = fruits.intersection(&veggies).cloned().collect();
    println!("fruits和veggies的交集: {:?}", intersection);

    // 并集
    let union: HashSet<_> = fruits.union(&veggies).cloned().collect();
    println!("fruits和veggies的并集: {:?}", union);
}